package com.artisan.day01;

import com.artisan.common.ApiKeys;
import dev.langchain4j.memory.chat.MessageWindowChatMemory;
import dev.langchain4j.model.chat.ChatLanguageModel;
import dev.langchain4j.model.openai.OpenAiChatModel;
import dev.langchain4j.service.AiServices;
import dev.langchain4j.service.MemoryId;
import dev.langchain4j.service.UserMessage;

import static dev.langchain4j.model.openai.OpenAiChatModelName.GPT_4_O_MINI;

/**
 * With AiServices:
 * - Separate chat memory for each user
 */
public class ServiceWithMemoryForEachUserExample {


    interface Assistant {

        String chat(@MemoryId int memoryId, @UserMessage String userMessage);
    }

    /**
     * 演示了如何使用OpenAI的GPT-4模型创建一个聊天助手，能够记忆对话上下文并进行个性化对话
     *
     * @param args 命令行参数
     */
    public static void main(String[] args) {

        // 构建一个聊天语言模型实例，需要指定API密钥和模型名称
        ChatLanguageModel model = OpenAiChatModel.builder()
                .apiKey(ApiKeys.OPENAI_API_KEY)
                .modelName(GPT_4_O_MINI)
                .build();

        // 构建一个助手实例，使用上述语言模型，并设置聊天记忆策略，这里设置为最多记忆10条消息
        Assistant assistant = AiServices.builder(Assistant.class)
                .chatLanguageModel(model)
                .chatMemoryProvider(memoryId -> MessageWindowChatMemory.withMaxMessages(10))
                .build();

        // 以下代码展示了与助手进行多次对话的过程，每次对话都基于之前的上下文
        System.out.println(assistant.chat(1, "我的名字是小工匠"));
        //你好，小工匠！很高兴认识你。你有什么想聊的或者想分享的事情吗？

        System.out.println(assistant.chat(2, "我的名字是Artisan"));
        // 你好，Artisan！很高兴认识你。有任何我可以帮助你的吗？

        // 询问第一位用户的名字，助手应能正确回答
        System.out.println(assistant.chat(1, "我叫什么名字?"));
        // 你叫小工匠。有什么特别的故事或含义吗？

        // 询问第二位用户的名字，以展示助手能根据不同用户记忆不同的信息
        System.out.println(assistant.chat(2, "我叫什么名字?"));
        // 你叫Artisan。有什么我可以帮助你的吗？
    }
}
